import { app, BrowserWindow, dialog, shell, ipcMain, screen, Menu } from 'electron'

import { release } from 'node:os'
import path from 'node:path'
import { join } from 'node:path'
import fs from 'fs';

// The built directory structure
//
// ├─┬ dist-electron
// │ ├─┬ main
// │ │ └── index.js    > Electron-Main
// │ └─┬ preload
// │   └── index.js    > Preload-Scripts
// ├─┬ dist
// │ └── index.html    > Electron-Renderer
//
process.env.DIST_ELECTRON = join(__dirname, '..')
process.env.DIST = join(process.env.DIST_ELECTRON, '../dist')
process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL
  ? join(process.env.DIST_ELECTRON, '../public')
  : process.env.DIST

// Disable GPU Acceleration for Windows 7
if (release().startsWith('6.1')) app.disableHardwareAcceleration()

// Set application name for Windows 10+ notifications
if (process.platform === 'win32') app.setAppUserModelId(app.getName())

if (!app.requestSingleInstanceLock()) {
  app.quit()
  process.exit(0)
}

let win: BrowserWindow | null = null
// Here, you can also use other preload
const preload = join(__dirname, '../preload/index.js')
const url = process.env.VITE_DEV_SERVER_URL
const indexHtml = join(process.env.DIST, 'index.html')


function showConfirmationDialog() {
  const options = {
    type: 'question',
    buttons: ['取消', '重启'],
    defaultId: 1,
    title: '重启提醒',
    message: '确定要重启应用吗?',
    cancelId: 0
  };

  dialog.showMessageBox(win, options).then((response) => {
    if (response.response === 1) {
      reloadPage();
    }
  });
}

function reloadPage() {
  win.reload();
}




async function createWindow() {

  const { width, height } = screen.getPrimaryDisplay().bounds; 



  win = new BrowserWindow({
    icon: path.join(process.env.PUBLIC, 'electron-vite.svg'),
    webPreferences: {
      preload: preload,
      // 开启node
      nodeIntegration: true, // node 集成环境
      contextIsolation: false,
      webSecurity: false
      // enableRemoteModule: true,//开启remote模块
    },
    width: width,
    height: height,
    show: false, // 默认不显示
    // 永远置顶
    alwaysOnTop: false,
  })


  if (process.env.VITE_DEV_SERVER_URL) { // electron-vite-vue#298
    win.loadURL(url)
    // Open devTool if the app is not packaged
    win.webContents.openDevTools()
  } else {
    win.loadFile(indexHtml)
  }

  
  const menuTemp = [
    { 
      label: '重置',
      accelerator: 'CmdOrCtrl+R',
      click() {
        // 在这里触发前置方法
        showConfirmationDialog();
      }
    },
    {
      label: '关于',
      role: 'about'
    },
  ]
  const menu =  Menu.buildFromTemplate(menuTemp)

  Menu.setApplicationMenu(menu)


    // 避免白屏的问题
    win.on('ready-to-show', () => {
      win?.show()
  
      // 监听dialog
  
      // ipcMain.on('chooseFile', (event) => {
      //   dialog.showOpenDialog({
      //     properties: ['openFile', 'multiSelections']
      //     // properties: ['openDirectory', 'multiSelections']
      //   }).then(res => {
      //     console.log(res)
      //     event.reply('chooseResult', res)
      //   }).catch(err => {
      //     console.log(err)
      //     event.reply('chooseResult', err)
      //   })
      // })
  
      // 导出文件
      const handleSaveFile = (event, { filePath, buffer }) => {
        dialog.showSaveDialog({ defaultPath: filePath })
          .then(result => {
            if (!result.canceled) {
              const fileToSave = result.filePath;
              fs.writeFile(fileToSave, buffer, (err) => {
                if (err) {
                  event.reply('saveFileResponse', { success: false, error: err.message });
                } else {
                  event.reply('saveFileResponse', { success: true });
                }
              });
            }
          })
          .catch(err => {
            event.reply('saveFileResponse', { success: false, error: err.message });
          });
      }
      ipcMain.removeListener('saveFile', handleSaveFile);
      ipcMain.on('saveFile', handleSaveFile);
  
  
    })





  // Test actively push message to the Electron-Renderer
  win.webContents.on('did-finish-load', () => {
    win?.webContents.send('main-process-message', new Date().toLocaleString())
  })

  // Make all links open with the browser, not with the application
  win.webContents.setWindowOpenHandler(({ url }) => {
    if (url.startsWith('https:')) shell.openExternal(url)
    return { action: 'deny' }
  })
  // win.webContents.on('will-navigate', (event, url) => { }) #344
}


app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  win = null
  if (process.platform !== 'darwin') app.quit()
})

app.on('second-instance', () => {
  if (win) {
    // Focus on the main window if the user tried to open another
    if (win.isMinimized()) win.restore()
    win.focus()
  }
})

app.on('activate', () => {
  const allWindows = BrowserWindow.getAllWindows()
  if (allWindows.length) {
    allWindows[0].focus()
  } else {
    createWindow()
  }
})

// New window example arg: new windows url
ipcMain.handle('open-win', (_, arg) => {
  const childWindow = new BrowserWindow({
    webPreferences: {
      preload,
      nodeIntegration: true,
      contextIsolation: false,
    },
  })

  if (process.env.VITE_DEV_SERVER_URL) {
    childWindow.loadURL(`${url}#${arg}`)
  } else {
    childWindow.loadFile(indexHtml, { hash: arg })
  }
})
